﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Web;
using Rendiciones.Logica.Enumeradores;
using Rendiciones.Logica.Modelos;
using Tesla.Excepciones;

namespace Rendiciones.Logica.Servicios
{
    public class ServGastos
    {
        public List<TipoGasto> TodosLosTiposDeGasto()
        {
            using (SqlConnection conection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ToString()))
            {
                conection.Open();
                string sQuery = @"execute sp_TipoGasto_Search";

                SqlCommand command = new SqlCommand(sQuery, conection);
                command.Parameters.Clear();
                
                try
                {
                    command.CommandTimeout = 0;
                    SqlDataReader drReader = command.ExecuteReader();
                    if (drReader.HasRows == false)
                    {
                        return new List<TipoGasto>();
                    }
                    var tipoGastos = new List<TipoGasto>();

                    while (drReader.Read())
                    {
                        var tipoGasto = new TipoGasto();
                        if (drReader["IdGasto"] != System.DBNull.Value)
                        {
                            tipoGasto.IdGasto = int.Parse(drReader["IdGasto"].ToString());
                        }
                        if (drReader["DescripcionGasto"] != System.DBNull.Value)
                        {
                            tipoGasto.DescripcionGasto = drReader["DescripcionGasto"].ToString();
                        }
                        tipoGastos.Add(tipoGasto);
                    }
                    drReader.Close();
                    return tipoGastos;
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message);
                }
            }
            
        }

        public List<TipoGasto> TiposDeGastoAsociados(int idGasto)
        {
            using (SqlConnection conection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ToString()))
            {
                conection.Open();
                string sQuery = @"execute sp_TipoGasto_Search_Asociado @IdGasto";

                SqlCommand command = new SqlCommand(sQuery, conection);
                command.Parameters.Clear();
                command.Parameters.AddWithValue("@IdGasto", idGasto);
                try
                {
                    command.CommandTimeout = 0;
                    SqlDataReader drReader = command.ExecuteReader();
                    if (drReader.HasRows == false)
                    {
                        return new List<TipoGasto>();
                    }
                    var tipoGastos = new List<TipoGasto>();

                    while (drReader.Read())
                    {
                        var tipoGasto = new TipoGasto();
                        if (drReader["IdGasto"] != System.DBNull.Value)
                        {
                            tipoGasto.IdGasto = int.Parse(drReader["IdGasto"].ToString());
                        }
                        if (drReader["DescripcionGasto"] != System.DBNull.Value)
                        {
                            tipoGasto.DescripcionGasto = drReader["DescripcionGasto"].ToString();
                        }
                        tipoGastos.Add(tipoGasto);
                    }
                    drReader.Close();
                    return tipoGastos;
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message);
                }
            }

        }

        public List<TipoGasto> TodosLosGastosAsociados()
        {
            using (SqlConnection conection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ToString()))
            {
                conection.Open();
                string sQuery = @"execute sp_TipoGasto_Search_TodosLosAsociados ";

                SqlCommand command = new SqlCommand(sQuery, conection);
                command.Parameters.Clear();
                
                try
                {
                    command.CommandTimeout = 0;
                    SqlDataReader drReader = command.ExecuteReader();
                    if (drReader.HasRows == false)
                    {
                        return new List<TipoGasto>();
                    }
                    var tipoGastos = new List<TipoGasto>();

                    while (drReader.Read())
                    {
                        var tipoGasto = new TipoGasto();
                        if (drReader["IdGasto"] != System.DBNull.Value)
                        {
                            tipoGasto.IdGasto = int.Parse(drReader["IdGasto"].ToString());
                        }
                        if (drReader["DescripcionGasto"] != System.DBNull.Value)
                        {
                            tipoGasto.DescripcionGasto = drReader["DescripcionGasto"].ToString();
                        }
                        tipoGastos.Add(tipoGasto);
                    }
                    drReader.Close();
                    return tipoGastos;
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message);
                }
            }

        }

        public void IngresarRendicion(ref Rendicion rendicion)
        {
            if (rendicion.IdRendicion != 0)
                ModificarRendicion(rendicion);
            else
                IngresarNuevaRendicion(ref rendicion);
        }

        private void ModificarRendicion(Rendicion gasto)
        {
            using (SqlConnection conection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ToString()))
            {
                conection.Open();

                SqlCommand command = new SqlCommand();
                command.Connection = conection;

                try
                {
                    string sQuery =
                        @"execute sp_Rendicion_Update  @IdRendicion, @IdProyecto, @CentroCosto, @FondoAsignado, @Saldo, @Estado, @ComentariosSupervisor, @ComentariosGerente ";

                    command = new SqlCommand(sQuery, conection);
                    command.Parameters.Clear();

                    command.Parameters.AddWithValue("@IdRendicion", gasto.IdRendicion);
                    command.Parameters.AddWithValue("@IdProyecto", gasto.IdProyecto);
                    command.Parameters.AddWithValue("@CentroCosto", gasto.CentroCosto);
                    command.Parameters.AddWithValue("@FondoAsignado", gasto.FondoAsignado);
                    command.Parameters.AddWithValue("@Saldo", gasto.Saldo);
                    command.Parameters.AddWithValue("@Estado", gasto.Estado);
                    command.Parameters.AddWithValue("@ComentariosSupervisor", string.IsNullOrEmpty(gasto.ComentariosSupervisor) ? "" : gasto.ComentariosSupervisor);
                    command.Parameters.AddWithValue("@ComentariosGerente", string.IsNullOrEmpty(gasto.ComentariosGerente) ? "" : gasto.ComentariosGerente);

                    command.CommandTimeout = 0;
                    command.ExecuteNonQuery();

                    var gastosAModificar = gasto.DetallesGasto.Where(g => g.IdGasto != 0).ToList();
                    var gastosNuevos = gasto.DetallesGasto.Where(g => g.IdGasto.Equals(0)).ToList();
                    gastosAModificar.ForEach(g => g.IdRendicion = gasto.IdRendicion);
                    gastosAModificar.ForEach(ModificarDetallesRendicion);
                    gastosNuevos.ForEach(g => g.IdRendicion = gasto.IdRendicion);
                    gastosNuevos.ForEach(IngresarDetallesRendicion);
                    gasto.GastosAEliminar.ForEach(EliminarDetalleRendicion);
                }
                catch
                    (Exception e)
                {
                    throw new Exception(e.Message);
                }
            }
        }
        private void ModificarDetallesRendicion(Gasto detalle)
        {
            using (SqlConnection conection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ToString()))
            {
                conection.Open();

                SqlCommand command = new SqlCommand();
                command.Connection = conection;

                try
                {
                    string sQuery =
                        @"execute sp_Gasto_Update  @IdGasto, @IdRendicion, @NroRendicion, @IdTipoGasto, @IdTipoDocumento,
                                                          @RutBeneficiario, @NombreBeneficiario, @Descripcion, @Archivo,
                                                          @MontoNeto, @Iva, @Retencion, @TotalPagado,
                                                          @FechaDocumento, @GastoAsociado, @NroDocumento,   
                                                          @ObservacionesSupervisor, @ObservacionesGerente, @Eliminado, @Rechazado,
                                                          @MontoExento, @TipoDocumentoGenerico";

                    command = new SqlCommand(sQuery, conection);
                    command.Parameters.Clear();

                    command.Parameters.AddWithValue("@IdGasto", detalle.IdGasto);
                    command.Parameters.AddWithValue("@IdRendicion", detalle.IdRendicion);
                    command.Parameters.AddWithValue("@NroRendicion", detalle.NroRendicion);
                    command.Parameters.AddWithValue("@IdTipoGasto", detalle.TipoGasto.IdGasto);
                    command.Parameters.AddWithValue("@IdTipoDocumento", detalle.TipoDocumento.IdDocumento);
                    command.Parameters.AddWithValue("@RutBeneficiario", detalle.RutBeneficiario);
                    command.Parameters.AddWithValue("@NombreBeneficiario", detalle.NombreBeneficiario);
                    command.Parameters.AddWithValue("@Descripcion", detalle.Descripcion);
                    //command.Parameters.AddWithValue("@Archivo", detalle.Archivo.ToString()); no se esta tomando el archivo por el momento
                    command.Parameters.AddWithValue("@Archivo", "1");
                    command.Parameters.AddWithValue("@MontoNeto", detalle.MontoNeto);
                    command.Parameters.AddWithValue("@Iva", detalle.Iva);
                    command.Parameters.AddWithValue("@Retencion", detalle.Retencion);
                    command.Parameters.AddWithValue("@TotalPagado", detalle.TotalPagado);
                    command.Parameters.AddWithValue("@FechaDocumento", detalle.FechaDocumento);
                    command.Parameters.AddWithValue("@GastoAsociado", detalle.GastoAsociado);
                    command.Parameters.AddWithValue("@NroDocumento", detalle.NroDocumento);
                    command.Parameters.AddWithValue("@ObservacionesSupervisor", string.IsNullOrEmpty(detalle.ObservacionesSupervisor) ? "" : detalle.ObservacionesSupervisor);
                    command.Parameters.AddWithValue("@ObservacionesGerente", string.IsNullOrEmpty(detalle.ObservacionesGerente) ? "" : detalle.ObservacionesGerente);
                    command.Parameters.AddWithValue("@Eliminado", detalle.Eliminado);
                    command.Parameters.AddWithValue("@Rechazado", detalle.Rechazado);
                    command.Parameters.AddWithValue("@MontoExento", detalle.MontoExento);
                    command.Parameters.AddWithValue("@TipoDocumentoGenerico", detalle.TipoDocumentoGenerico);
                    command.CommandTimeout = 0;
                    command.ExecuteNonQuery();

                }
                catch (Exception e)
                {

                    throw new Exception(e.Message);
                }
            }
        }

        private void IngresarNuevaRendicion(ref Rendicion rendicion)
        {
            using (SqlConnection conection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ToString()))
            {
                conection.Open();

                SqlCommand command = new SqlCommand();
                command.Connection = conection;

                try
                {
                    string sQuery =
                        @"execute sp_Rendicion_Create  @IdProyecto, @CentroCosto, @FondoAsignado, @Saldo , @Estado, @IdUsuario ";

                    command = new SqlCommand(sQuery, conection);
                    command.Parameters.Clear();

                    command.Parameters.AddWithValue("@IdProyecto", rendicion.IdProyecto);
                    command.Parameters.AddWithValue("@CentroCosto", rendicion.CentroCosto);
                    command.Parameters.AddWithValue("@FondoAsignado", rendicion.FondoAsignado);
                    command.Parameters.AddWithValue("@Saldo", rendicion.Saldo);
                    command.Parameters.AddWithValue("@Estado", rendicion.Estado);
                    command.Parameters.AddWithValue("@IdUsuario", rendicion.UsuarioIngreso.IdUsuario);

                    command.CommandTimeout = 0;
                    SqlDataReader drReader = command.ExecuteReader();
                    if (drReader.HasRows == false)
                    {
                        throw new Exception();
                    }

                    var idRendicion = 0;
                    while (drReader.Read())
                    {
                        idRendicion = int.Parse(drReader["IdRendicion"].ToString());
                        rendicion.IdRendicion = idRendicion;
                    }
                    drReader.Close();

                    rendicion.DetallesGasto.ForEach(g => g.IdRendicion = idRendicion);
                    rendicion.DetallesGasto.ForEach(IngresarDetallesRendicion);
                }
                catch
                    (Exception e)
                {
                    throw new Exception(e.Message);
                }
            }
            
        }
        private void IngresarDetallesRendicion(Gasto detalle)
        {
            using (SqlConnection conection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ToString()))
            {

                conection.Open();

                SqlCommand command = new SqlCommand();
                command.Connection = conection;

                try
                {
                    string sQuery =
                        @"execute sp_Gasto_Create  @IdRendicion, @IdTipoGasto, @IdTipoDocumento,
                                                          @RutBeneficiario, @NombreBeneficiario, @Descripcion, @Archivo,
                                                          @MontoNeto, @Iva, @Retencion, @TotalPagado,
                                                          @FechaDocumento, @GastoAsociado, @NroDocumento,@MontoExento, @TipoDocumentoGenerico";

                    command = new SqlCommand(sQuery, conection);
                    command.Parameters.Clear();

                    command.Parameters.AddWithValue("@IdRendicion", detalle.IdRendicion);
                    command.Parameters.AddWithValue("@IdTipoGasto", detalle.TipoGasto.IdGasto);
                    command.Parameters.AddWithValue("@IdTipoDocumento", detalle.TipoDocumento.IdDocumento);
                    command.Parameters.AddWithValue("@RutBeneficiario", detalle.RutBeneficiario);
                    command.Parameters.AddWithValue("@NombreBeneficiario", detalle.NombreBeneficiario);
                    command.Parameters.AddWithValue("@Descripcion", detalle.Descripcion);
                    //command.Parameters.AddWithValue("@Archivo", detalle.Archivo.ToString()); no se esta tomando el archivo por el momento
                    command.Parameters.AddWithValue("@Archivo", "1");
                    command.Parameters.AddWithValue("@MontoNeto", detalle.MontoNeto);
                    command.Parameters.AddWithValue("@Iva", detalle.Iva);
                    command.Parameters.AddWithValue("@Retencion", detalle.Retencion);
                    command.Parameters.AddWithValue("@TotalPagado", detalle.TotalPagado);
                    command.Parameters.AddWithValue("@FechaDocumento", detalle.FechaDocumento.Equals(DateTime.MinValue) ? DateTime.Now : detalle.FechaDocumento);
                    command.Parameters.AddWithValue("@GastoAsociado", detalle.GastoAsociado);
                    command.Parameters.AddWithValue("@NroDocumento", detalle.NroDocumento);
                    command.Parameters.AddWithValue("@MontoExento", detalle.MontoExento);
                    command.Parameters.AddWithValue("@TipoDocumentoGenerico", detalle.TipoDocumentoGenerico);
                    
                    command.CommandTimeout = 0;
                    command.ExecuteNonQuery();
                    
                }
                catch(Exception e)
                {
                    
                    throw new Exception(e.Message);
                }
            }
        }

        private void EliminarDetalleRendicion(Gasto detalle)
        {
            using (SqlConnection conection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ToString()))
            {
                conection.Open();

                SqlCommand command = new SqlCommand();
                command.Connection = conection;

                try
                {
                    string sQuery =
                        @"execute sp_Gasto_Delete  @IdGasto, @IdRendicion";

                    command = new SqlCommand(sQuery, conection);
                    command.Parameters.Clear();

                    command.Parameters.AddWithValue("@IdGasto", detalle.IdGasto);
                    command.Parameters.AddWithValue("@IdRendicion", detalle.IdRendicion);
                    command.CommandTimeout = 0;
                    command.ExecuteNonQuery();

                }
                catch (Exception e)
                {

                    throw new Exception(e.Message);
                }
            }
        }


        public List<RendicionSimple> BuscarRendicionesPorEstado(int estado, int idUsuario, int rolUsuario)
        {
            using (SqlConnection conection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ToString()))
            {
                conection.Open();

                SqlCommand command = new SqlCommand();
                command.Connection = conection;

                try
                {
                    string sQuery =
                        @"execute sp_Rendicion_Search_PorEstado @Estado, @IdUsuario, @RolUsuario";

                    command = new SqlCommand(sQuery, conection);
                    command.Parameters.Clear();
                    command.Parameters.AddWithValue("@Estado", estado);
                    command.Parameters.AddWithValue("@IdUsuario", idUsuario);
                    command.Parameters.AddWithValue("@RolUsuario", rolUsuario);

                    command.CommandTimeout = 0;
                    SqlDataReader drReader = command.ExecuteReader();
                    if (drReader.HasRows == false)
                    {
                        return new List<RendicionSimple>();
                    }

                    var rendicionesPendientes = new List<RendicionSimple>();
                    while (drReader.Read())
                    {
                        var rendicion = new RendicionSimple();

                        rendicion.IdRendicion = int.Parse(drReader["IdRendicion"].ToString());
                        rendicion.NombreProyecto = drReader["NombreProyecto"].ToString();
                        rendicion.CentroCosto = drReader["CentroCosto"].ToString();
                        rendicion.Estado = drReader["Estado"].ToString();
                        rendicion.FechaCreacion = Convert.ToDateTime(drReader["FechaCreacion"].ToString());
                        rendicion.UsuarioCreacion = drReader["UsuarioCreacion"].ToString();
                        rendicionesPendientes.Add(rendicion);

                    }
                    drReader.Close();
                    return rendicionesPendientes;
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message);
                }
            }
        }

        public List<RendicionSimple> BuscarRendicionesPendientes(int estado, int idUsuario, int rolUsuario)
        {
            using (SqlConnection conection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ToString()))
            {
                conection.Open();

                SqlCommand command = new SqlCommand();
                command.Connection = conection;

                try
                {
                    string sQuery =
                        @"execute sp_Rendicion_Search_Pendientes @Estado, @IdUsuario, @RolUsuario";

                    command = new SqlCommand(sQuery, conection);
                    command.Parameters.Clear();
                    command.Parameters.AddWithValue("@Estado", estado);
                    command.Parameters.AddWithValue("@IdUsuario", idUsuario);
                    command.Parameters.AddWithValue("@RolUsuario", rolUsuario);

                    command.CommandTimeout = 0;
                    SqlDataReader drReader = command.ExecuteReader();
                    if (drReader.HasRows == false)
                    {
                        return new List<RendicionSimple>();
                    }

                    var rendicionesPendientes = new List<RendicionSimple>();
                    while (drReader.Read())
                    {
                        var rendicion = new RendicionSimple();

                        rendicion.IdRendicion = int.Parse(drReader["IdRendicion"].ToString());
                        rendicion.NombreProyecto = drReader["NombreProyecto"].ToString();
                        rendicion.CentroCosto = drReader["CentroCosto"].ToString();
                        rendicion.Estado = drReader["Estado"].ToString();
                        rendicion.FechaCreacion = Convert.ToDateTime(drReader["FechaCreacion"].ToString());
                        rendicionesPendientes.Add(rendicion);

                    }
                    drReader.Close();
                    return rendicionesPendientes;
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message);
                }
            }
        }
        
        public Rendicion CargarRendicionPorId(int idRendicion)
        {
            using (SqlConnection conection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ToString()))
            {
                conection.Open();

                SqlCommand command = new SqlCommand();
                command.Connection = conection;

                try
                {
                    string sQuery =
                        @"execute sp_Rendicion_Read_PorId @IdRendicion";

                    command = new SqlCommand(sQuery, conection);
                    command.Parameters.Clear();
                    command.Parameters.AddWithValue("@IdRendicion", idRendicion);

                    command.CommandTimeout = 0;
                    SqlDataReader drReader = command.ExecuteReader();
                    if (drReader.HasRows == false)
                    {
                        return new Rendicion();
                    }

                    var rendicion = new Rendicion();
                    while (drReader.Read())
                    {
                        rendicion.IdRendicion = int.Parse(drReader["IdRendicion"].ToString());
                        rendicion.IdProyecto = int.Parse(drReader["IdProyecto"].ToString());
                        rendicion.NombreProyecto = drReader["NombreProyecto"].ToString();
                        rendicion.CentroCosto = drReader["CentroCosto"].ToString();
                        rendicion.FondoAsignado = int.Parse(drReader["FondoAsignado"].ToString());
                        rendicion.Saldo = int.Parse(drReader["Saldo"].ToString());
                        rendicion.Estado = (EEstadoRendicion)int.Parse(drReader["Estado"].ToString());
                        rendicion.FechaCreacion = Convert.ToDateTime(drReader["FechaCreacion"].ToString());
                        rendicion.ComentariosSupervisor = drReader["ComentariosSupervisor"].ToString();
                        rendicion.ComentariosGerente = drReader["ComentariosGerente"].ToString();


                    }
                    drReader.Close();
                    return rendicion;

                }
                catch (Exception e)
                {
                    throw new Exception(e.Message);
                }
            }
        }
        
        public List<Gasto> BuscarGastosDeRendicion(int idRendicion)
        {
            using (SqlConnection conection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ToString()))
            {
                conection.Open();

                SqlCommand command = new SqlCommand();
                command.Connection = conection;

                try
                {
                    string sQuery =
                        @"execute sp_Gasto_Search_DeRendicion @IdRendicion";

                    command = new SqlCommand(sQuery, conection);
                    command.Parameters.Clear();
                    command.Parameters.AddWithValue("@IdRendicion", idRendicion);

                    command.CommandTimeout = 0;
                    SqlDataReader drReader = command.ExecuteReader();
                    if (drReader.HasRows == false)
                    {
                        return new List<Gasto>();
                    }

                    var gastos = new List<Gasto>();
                    while (drReader.Read())
                    {
                        var gasto = new Gasto();

                        gasto.IdGasto = int.Parse(drReader["IdGasto"].ToString());
                        gasto.IdRendicion = int.Parse(drReader["IdRendicion"].ToString());
                        //gasto.NroRendicion = int.Parse(drReader["NroRendicion"].ToString());
                        gasto.TipoGasto = new TipoGasto { IdGasto = int.Parse(drReader["TipoGasto.IdGasto"].ToString()) };
                        gasto.TipoGasto.DescripcionGasto = drReader["TipoGasto.DescripcionGasto"].ToString();
                        gasto.TipoDocumento = new TipoDocumento { IdDocumento = int.Parse(drReader["TipoDocumento.IdDocumento"].ToString()) };
                        gasto.TipoDocumento.Descripcion = drReader["TipoDocumento.Descripcion"].ToString();
                        gasto.RutBeneficiario = drReader["RutBeneficiario"].ToString();
                        gasto.NombreBeneficiario = drReader["NombreBeneficiario"].ToString();
                        gasto.Descripcion = drReader["Descripcion"].ToString();
                        //gasto.Archivo = drReader["Archivo"].ToString();
                        gasto.MontoNeto = int.Parse(drReader["MontoNeto"].ToString());
                        gasto.Iva = int.Parse(drReader["Iva"].ToString());
                        gasto.Retencion = int.Parse(drReader["Retencion"].ToString());
                        gasto.TotalPagado = int.Parse(drReader["TotalPagado"].ToString());
                        gasto.FechaDocumento = Convert.ToDateTime(drReader["FechaDocumento"].ToString());
                        gasto.GastoAsociado = int.Parse(drReader["GastoAsociado"].ToString());
                        gasto.NroDocumento = int.Parse(drReader["NroDocumento"].ToString());
                        gasto.ObservacionesSupervisor = drReader["ObservacionesSupervisor"].ToString();
                        gasto.ObservacionesGerente = drReader["ObservacionesGerente"].ToString();
                        gasto.Eliminado = !string.IsNullOrEmpty(drReader["Eliminado"].ToString()) && bool.Parse(drReader["Eliminado"].ToString());
                        gasto.Rechazado = !string.IsNullOrEmpty(drReader["Rechazado"].ToString()) && bool.Parse(drReader["Rechazado"].ToString());
                        gasto.MontoExento = !string.IsNullOrEmpty(drReader["MontoExento"].ToString()) ? int.Parse(drReader["MontoExento"].ToString()) : 0;
                        gasto.TipoDocumentoGenerico = !string.IsNullOrEmpty(drReader["TipoDocumentoGenerico"].ToString()) ? (ETipoDocumentoGenerico)int.Parse(drReader["TipoDocumentoGenerico"].ToString()) : ETipoDocumentoGenerico.Boleta;
                        gastos.Add(gasto);

                    }
                    drReader.Close();
                    return gastos;
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message);
                }
            }
        }

        public void ActualizaEstadoRendicion(int idEstado, int idRendicion)
        {
            using (SqlConnection conection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ToString()))
            {
                conection.Open();

                SqlCommand command = new SqlCommand();
                command.Connection = conection;

                try
                {
                    string sQuery =
                        @"execute sp_Rendicion_Update_Estado  @IdRendicion, @IdEstado ";

                    command = new SqlCommand(sQuery, conection);
                    command.Parameters.Clear();

                    command.Parameters.AddWithValue("@IdRendicion", idRendicion);
                    command.Parameters.AddWithValue("@IdEstado", idEstado);
                    
                    command.CommandTimeout = 0;
                    command.ExecuteNonQuery();
                    
                }
                catch
                    (Exception e)
                {
                    throw new Exception(e.Message);
                }
            }
        }

        public void PagarRendicion(PagoRendicion pago)
        {
            using (SqlConnection conection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ToString()))
            {
                conection.Open();

                SqlCommand command = new SqlCommand();
                command.Connection = conection;

                try
                {
                    string sQuery =
                        @"execute sp_Rendicion_Update_Pagar  @IdRendicion, @IdEstado, @Monto,@IdBanco, @NroChequeDesde, @NroChequeHasta
                            , @NroTransferencia, @NroDeposito";

                    command = new SqlCommand(sQuery, conection);
                    command.Parameters.Clear();

                    command.Parameters.AddWithValue("@IdRendicion", pago.IdRendicion);
                    command.Parameters.AddWithValue("@IdEstado", (int)EEstadoRendicion.Pagado);
                    command.Parameters.AddWithValue("@Monto", pago.Monto);
                    command.Parameters.AddWithValue("@IdBanco", pago.IdBanco);
                    command.Parameters.AddWithValue("@NroChequeDesde", pago.NroChequeDesde);
                    command.Parameters.AddWithValue("@NroChequehasta", pago.NroChequeHasta);
                    command.Parameters.AddWithValue("@NroTransferencia", pago.NroTransferencia);
                    command.Parameters.AddWithValue("@NroDeposito", pago.NroDeposito);

                    command.CommandTimeout = 0;
                    command.ExecuteNonQuery();

                }
                catch
                    (Exception e)
                {
                    throw new Exception(e.Message);
                }
            }
        }


        public List<Proyecto> TodosLosProyectosAsociados(int idUsuario, ERol rolUsuario)
        {
            using (SqlConnection conection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ToString()))
            {
                conection.Open();
                string sQuery = @"execute sp_Proyecto_Search_PorUsuario @IdUsuario, @RolUsuario";
                

                SqlCommand command = new SqlCommand(sQuery, conection);
                command.Parameters.Clear();
                command.Parameters.AddWithValue("@IdUsuario", idUsuario);
                command.Parameters.AddWithValue("@RolUsuario", rolUsuario);

                try
                {
                    command.CommandTimeout = 0;
                    SqlDataReader drReader = command.ExecuteReader();
                    if (drReader.HasRows == false)
                    {
                        return new List<Proyecto>();
                    }
                    var listadoProyectos = new List<Proyecto>();

                    while (drReader.Read())
                    {
                        var proyecto = new Proyecto();
                        if (drReader["IdProyecto"] != System.DBNull.Value)
                        {
                            proyecto.IdProyecto = int.Parse(drReader["IdProyecto"].ToString());
                        }
                        if (drReader["Nombre"] != System.DBNull.Value)
                        {
                            proyecto.Nombre = drReader["Nombre"].ToString();
                        }
                        if (drReader["CentroCosto"] != System.DBNull.Value)
                        {
                            proyecto.CentroCosto = drReader["CentroCosto"].ToString();
                        }
                        listadoProyectos.Add(proyecto);
                    }
                    drReader.Close();
                    return listadoProyectos;
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message);
                }
            }
        }

        public List<TipoDocumento> TodosLosTiposDeDocumento()
        {
            using (SqlConnection conection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStr"].ToString()))
            {
                conection.Open();
                string sQuery = @"execute sp_TipoDocumento_Search";

                SqlCommand command = new SqlCommand(sQuery, conection);
                command.Parameters.Clear();

                try
                {
                    command.CommandTimeout = 0;
                    SqlDataReader drReader = command.ExecuteReader();
                    if (drReader.HasRows == false)
                    {
                        return new List<TipoDocumento>();
                    }
                    var listadoDocumento = new List<TipoDocumento>();

                    while (drReader.Read())
                    {
                        var tipoDoc = new TipoDocumento();
                        if (drReader["IdDocumento"] != System.DBNull.Value)
                        {
                            tipoDoc.IdDocumento = int.Parse(drReader["IdDocumento"].ToString());
                        }
                        if (drReader["Descripcion"] != System.DBNull.Value)
                        {
                            tipoDoc.Descripcion = drReader["Descripcion"].ToString();
                        }
                        listadoDocumento.Add(tipoDoc);
                    }
                    drReader.Close();
                    return listadoDocumento;
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message);
                }
            }
        }
    }
}